/*
 * JFrameParqueadero.java
 *
 * Created on March 18, 2009, 5:06 AM
 */

package mpParqueadero;

import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import mnParqueadero.*;

/**
 *
 * @author  Oscar Franco
 */
public class JFrameParqueadero extends javax.swing.JFrame {
    /**
     * Indicadores Puesto Parqueo
     */
    private JTextField puestos[];
    
     /**
     * Es una referencia al parqueadero que se está mostrando
     */
    private Parqueadero parqueadero = new Parqueadero(1300);
    
    

    /** Creates new form JFrameParqueadero */
    public JFrameParqueadero() {
        initComponents();
        inicializarGrafico();
        refrescarInformacion( );
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanelParqueadero = new javax.swing.JPanel();
        jPanelHora = new javax.swing.JPanel();
        jLabelHora = new javax.swing.JLabel();
        jButtonIngresar = new javax.swing.JButton();
        jButtonSalir = new javax.swing.JButton();
        jButtonAvanzar = new javax.swing.JButton();
        jPanelInformacion = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jTextFieldCaja = new javax.swing.JTextField();
        jTextFieldPuestos = new javax.swing.JTextField();
        jButtonObtenerInformacion = new javax.swing.JButton();
        jButtonConsultarPuesto = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanelParqueadero.setBorder(javax.swing.BorderFactory.createTitledBorder("Parqueadero"));

        javax.swing.GroupLayout jPanelParqueaderoLayout = new javax.swing.GroupLayout(jPanelParqueadero);
        jPanelParqueadero.setLayout(jPanelParqueaderoLayout);
        jPanelParqueaderoLayout.setHorizontalGroup(
            jPanelParqueaderoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 838, Short.MAX_VALUE)
        );
        jPanelParqueaderoLayout.setVerticalGroup(
            jPanelParqueaderoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 212, Short.MAX_VALUE)
        );

        jPanelHora.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Hora Actual", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        jLabelHora.setText("00:00");

        javax.swing.GroupLayout jPanelHoraLayout = new javax.swing.GroupLayout(jPanelHora);
        jPanelHora.setLayout(jPanelHoraLayout);
        jPanelHoraLayout.setHorizontalGroup(
            jPanelHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelHoraLayout.createSequentialGroup()
                .addComponent(jLabelHora)
                .addContainerGap(66, Short.MAX_VALUE))
        );
        jPanelHoraLayout.setVerticalGroup(
            jPanelHoraLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabelHora)
        );

        jButtonIngresar.setText("Ingresar");
        jButtonIngresar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonIngresarActionPerformed(evt);
            }
        });

        jButtonSalir.setText("Salir");
        jButtonSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonSalirActionPerformed(evt);
            }
        });

        jButtonAvanzar.setText("Avanzar");
        jButtonAvanzar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonAvanzarActionPerformed(evt);
            }
        });

        jPanelInformacion.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Informacion", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel1.setText("Total En Caja");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel2.setText("Puestos Libres");

        javax.swing.GroupLayout jPanelInformacionLayout = new javax.swing.GroupLayout(jPanelInformacion);
        jPanelInformacion.setLayout(jPanelInformacionLayout);
        jPanelInformacionLayout.setHorizontalGroup(
            jPanelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacionLayout.createSequentialGroup()
                .addGap(147, 147, 147)
                .addGroup(jPanelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2))
                .addGap(40, 40, 40)
                .addGroup(jPanelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jTextFieldPuestos)
                    .addComponent(jTextFieldCaja, javax.swing.GroupLayout.DEFAULT_SIZE, 114, Short.MAX_VALUE))
                .addContainerGap(174, Short.MAX_VALUE))
        );
        jPanelInformacionLayout.setVerticalGroup(
            jPanelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelInformacionLayout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addGroup(jPanelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextFieldCaja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 21, Short.MAX_VALUE)
                .addGroup(jPanelInformacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel2)
                    .addComponent(jTextFieldPuestos, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(21, 21, 21))
        );

        jButtonObtenerInformacion.setText("Obtener Informacion");
        jButtonObtenerInformacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonObtenerInformacionActionPerformed(evt);
            }
        });

        jButtonConsultarPuesto.setText("Consultar Puesto");
        jButtonConsultarPuesto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonConsultarPuestoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanelParqueadero, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addGap(63, 63, 63)
                .addComponent(jButtonIngresar, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(54, 54, 54)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jButtonSalir, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanelHora, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(57, 57, 57)
                .addComponent(jButtonAvanzar, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(50, 50, 50)
                .addComponent(jButtonObtenerInformacion)
                .addGap(27, 27, 27)
                .addComponent(jButtonConsultarPuesto)
                .addContainerGap(40, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addGap(80, 80, 80)
                .addComponent(jPanelInformacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(200, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanelParqueadero, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanelHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonIngresar)
                    .addComponent(jButtonSalir)
                    .addComponent(jButtonAvanzar)
                    .addComponent(jButtonObtenerInformacion)
                    .addComponent(jButtonConsultarPuesto))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 26, Short.MAX_VALUE)
                .addComponent(jPanelInformacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void jButtonAvanzarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAvanzarActionPerformed
    avanzar();
}//GEN-LAST:event_jButtonAvanzarActionPerformed

private void jButtonIngresarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonIngresarActionPerformed
    ingresar( );
}//GEN-LAST:event_jButtonIngresarActionPerformed

private void jButtonSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonSalirActionPerformed
    salir();
}//GEN-LAST:event_jButtonSalirActionPerformed

private void jButtonObtenerInformacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonObtenerInformacionActionPerformed
    obtenerInformacionCarro( );
}//GEN-LAST:event_jButtonObtenerInformacionActionPerformed

private void jButtonConsultarPuestoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonConsultarPuestoActionPerformed
    
    obtenerPlaca( );
}//GEN-LAST:event_jButtonConsultarPuestoActionPerformed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JFrameParqueadero().setVisible(true);
            }
        });
    }
    
    //----------------------
    //Metodos Propios
    //----------------------
    
 /**
     * Este método se encarga de actualizar los datos que se presentan en la interfaz
     */
    public void refrescarInformacion( )
    {
        refrescarParqueadero( );
        cambiarHora( parqueadero.getHoraActual() );
        actualizarDatos( parqueadero.calcularPuestosLibres( ), parqueadero.getCaja() );
    }
    
    /**
     * Este método se encarga de actualizar la representación del parqueadero <br>
     * <b>post: </b>Se actualiza la información mostrada del parqueadero
     */
    public void refrescarParqueadero( )
    {
        for( int i = 0; i < 90; i++ )
        {
            if( parqueadero.estaOcupado( i ) )
                puestos[ i ].setBackground( Color.RED );
            else
                puestos[ i ].setBackground( Color.BLUE );
        }
    }
        
    
    /**
     * Cambia la hora presentada <br>
     * <b>post: </b>Se est� mostrando la nueva hora
     * @param hora - Nueva hora que debe mostrarse
     */
    public void cambiarHora( int hora )
    {
        jLabelHora.setText( hora + ":00" );
    }
      /**
     * Actualiza la informaci�n mostrada <br>
     * <b>post: </b>Se actualiz� la informaci�n mostrada
     * @param numVacios - N�mero de puestos vac�os
     * @param montoCaja - Cantidad de dinero en la caja
     */
    public void actualizarDatos( int numVacios, float montoCaja )
    {
        jTextFieldPuestos.setText( "" + numVacios );
        jTextFieldCaja.setText( "$ " + montoCaja );
    }
    
     /**
     * Sirve para hacer avanzar una hora el reloj del parqueadero.
     */
    public void avanzar( )
    {
        parqueadero.avanzarHoraActual();
        refrescarInformacion( );
    }
     public void ingresar( )
    {
        String placa = JOptionPane.showInputDialog( this,
                "Por favor digite la placa del carro que está ingresando" );
        if( placa != null )
        {
            try
            {
                Puesto puesto = parqueadero.entrarCarro( placa );
                JOptionPane.showMessageDialog( this, "vaya el puesto"+ puesto.getNumero());
             
            }
            catch(Exception ex)
            {
                   JOptionPane.showMessageDialog( this, "Lo sentimos:..."+ ex.getMessage());
            }
            
         }
            refrescarInformacion( );
        }
     
     /**
     * Este método sirve para sacar un carro del parqueadero. Debe pedir la placa y 
      * luego contactar al parqueadero para sacar el carro y saber cu�nto debe 
      * cancelar. Si la placa no corresponde a un carro que est� 
      * en el parqueadero entonces debe mostrar un error.
     */
    public void salir( )
    {
        String placa = JOptionPane.showInputDialog( this, 
                "Por favor digite la placa del carro que está saliendo" );
        if( placa != null )
        {
            try
            {                  
                float valor = parqueadero.sacarCarro( placa );
                 JOptionPane.showMessageDialog( this, "Valor a Pagar= $"+valor);
            }
            catch(Exception ex)
            {
                JOptionPane.showMessageDialog( this, "Lo sentimos:..."+ex.getMessage());
            }
            refrescarInformacion( );
        }
        else
            JOptionPane.showMessageDialog( this, "Placa inválida: intente de nuevo..." );
    }
    /**
     * esta funcion permite saber a que horas entro y cuantas horas lleva parqueado un carro
     */
    public void obtenerInformacionCarro( )
    {
        String placa = JOptionPane.showInputDialog( this, 
                "Por favor digite la placa del carro del cual desea obtener informacion" );
        
        if( placa != null )
        {
            try
            {                  
                
                 Carro carro = parqueadero.obtenerHoraEntrada(placa);
                 int horaActual = parqueadero.getHoraActual();
        
                 JOptionPane.showMessageDialog( this, "Hora de entrada: "+carro.getHoraLLegada());
                 JOptionPane.showMessageDialog( this, "Tiempo que lleva en el parqueadero: " +carro.darTiempoParqueo(horaActual));
                 
            }
            catch(Exception ex)
            {
                JOptionPane.showMessageDialog( this, "Lo sentimos:..."+ex.getMessage());
            }
            refrescarInformacion( );
        }
        else
            JOptionPane.showMessageDialog( this, "Placa inválida: intente de nuevo..." );
    }
    
     public void obtenerPlaca( )
    {
        String puesto = JOptionPane.showInputDialog( this, 
                "Por favor digite el  numero del puesto del cual desea obtener informacion" );
        int cPuesto = Integer.parseInt(puesto);
        if( !parqueadero.estaOcupado( cPuesto ) )
            JOptionPane.showMessageDialog( this, "El puesto no esta ocupado");
        else
        {
             String placaCarro = parqueadero.obtenerPlacaParqueadero(cPuesto); 
             JOptionPane.showMessageDialog( this, "El carro ubicado en el puesto numero: "+cPuesto +"tiene la placa numero: "+ placaCarro);
        }
        
            
    }

    public void carrosPuesto()
    {

        String puesto = JOptionPane.showInputDialog( this,
                "Por favor digite el  numero del puesto del cual desea obtener informacion" );
        int cPuesto = Integer.parseInt(puesto);
        if( !parqueadero.estaOcupado( cPuesto ) )
            JOptionPane.showMessageDialog( this, "El puesto no esta ocupado");
        else
        {
             int numCarros = parqueadero.obtenerCarrosPuesto(cPuesto);
             JOptionPane.showMessageDialog( this, "El numero de carros en el puesto numero: " +cPuesto +"es: "+ numCarros);
        }
    }

    public void cerrarParqueadero()
    {
        float totalCaja = parqueadero.getCaja();
        int cantCarros = 0;

        for( int i = 0; i < 90; i++ )
        {
            if( parqueadero.estaOcupado( i ) )
                cantCarros++;
        }
        parqueadero.setCaja(0);
        parqueadero.setHoraActual(6);
        parqueadero.setAbierto(false);


    }


private void inicializarGrafico( )
    { 
        jPanelParqueadero.setLayout( new GridLayout( 5, 20 ) );       
        puestos = new JTextField[parqueadero.calcularPuestosLibres()];
        for( int i = 0; i < parqueadero.calcularPuestosLibres( ); i++ )
        {
            puestos[ i ] = new JTextField( );
            puestos[ i ].setText( "" + ( i + 1 ) );
            puestos[ i ].setEnabled( false );
            puestos[ i ].setBackground( Color.BLUE );
            jPanelParqueadero.add( puestos[ i ] );
        }
        
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonAvanzar;
    private javax.swing.JButton jButtonConsultarPuesto;
    private javax.swing.JButton jButtonIngresar;
    private javax.swing.JButton jButtonObtenerInformacion;
    private javax.swing.JButton jButtonSalir;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabelHora;
    private javax.swing.JPanel jPanelHora;
    private javax.swing.JPanel jPanelInformacion;
    private javax.swing.JPanel jPanelParqueadero;
    private javax.swing.JTextField jTextFieldCaja;
    private javax.swing.JTextField jTextFieldPuestos;
    // End of variables declaration//GEN-END:variables

}
